#include "gdkprivate-wayland.h"
#include "gdkinternals.h"
#include "gdkdeviceprivate.h"
+#include "gdkprivate-wayland.h"
+#include "xdg-shell-unstable-v6-client-protocol.h"
#include <stdlib.h>
#include <stdio.h>
GSList *outputs;
struct wl_surface *wl_surface;
- struct xdg_surface *xdg_surface;
- struct xdg_popup *xdg_popup;
+ struct zxdg_surface_v6 *xdg_surface;
+ struct zxdg_toplevel_v6 *xdg_toplevel;
+ struct zxdg_popup_v6 *xdg_popup;
struct gtk_surface1 *gtk_surface;
struct wl_subsurface *wl_subsurface;
struct wl_egl_window *egl_window;
EGLSurface egl_surface;
EGLSurface dummy_egl_surface;
+ unsigned int initial_configure_received : 1;
unsigned int mapped : 1;
unsigned int use_custom_surface : 1;
unsigned int pending_buffer_attached : 1;
} pending_move_to_rect;
struct {
+ int width;
+ int height;
GdkWindowState state;
} pending;
};
gint64 presentation_time;
gint64 refresh_interval;
+ if (window->update_freeze_count > 0)
+ return;
+
gdk_frame_clock_get_refresh_info (clock,
timings->frame_time,
&refresh_interval, &presentation_time);
if (!impl->pending_commit)
return;
+ if (window->update_freeze_count > 0)
+ return;
+
callback = wl_surface_frame (impl->display_server.wl_surface);
wl_callback_add_listener (callback, &frame_listener, window);
_gdk_frame_clock_freeze (clock);
{
GdkWindowImplWayland *impl = GDK_WINDOW_IMPL_WAYLAND (window->impl);
GdkWindowImplWayland *impl_parent = NULL;
- struct xdg_surface *parent_surface;
+ struct zxdg_toplevel_v6 *parent_toplevel;
g_assert (parent == NULL ||
gdk_window_get_display (window) == gdk_window_get_display (parent));
- if (!impl->display_server.xdg_surface)
+ if (!impl->display_server.xdg_toplevel)
return;
if (impl->transient_for)
if (!impl_parent->display_server.wl_surface)
return;
- parent_surface = impl_parent->display_server.xdg_surface;
+ parent_toplevel = impl_parent->display_server.xdg_toplevel;
}
else
- parent_surface = NULL;
+ parent_toplevel = NULL;
- xdg_surface_set_parent (impl->display_server.xdg_surface, parent_surface);
+ zxdg_toplevel_v6_set_parent (impl->display_server.xdg_toplevel,
+ parent_toplevel);
}
static void
{
GdkWindowImplWayland *impl = GDK_WINDOW_IMPL_WAYLAND (window->impl);
- if (!impl->display_server.xdg_surface)
+ if (!impl->display_server.xdg_toplevel)
return;
if (!impl->title)
return;
- xdg_surface_set_title (impl->display_server.xdg_surface, impl->title);
+ zxdg_toplevel_v6_set_title (impl->display_server.xdg_toplevel, impl->title);
}
static void
return;
gdk_wayland_window_get_window_geometry (window, &geometry);
- xdg_surface_set_window_geometry (impl->display_server.xdg_surface,
- geometry.x,
- geometry.y,
- geometry.width,
- geometry.height);
+ zxdg_surface_v6_set_window_geometry (impl->display_server.xdg_surface,
+ geometry.x,
+ geometry.y,
+ geometry.width,
+ geometry.height);
}
static struct wl_region *
}
static void
-xdg_surface_configure (void *data,
- struct xdg_surface *xdg_surface,
- int32_t width,
- int32_t height,
- struct wl_array *states,
- uint32_t serial)
+xdg_surface_configure (void *data,
+ struct zxdg_surface_v6 *xdg_surface,
+ uint32_t serial)
{
GdkWindow *window = GDK_WINDOW (data);
GdkWindowImplWayland *impl = GDK_WINDOW_IMPL_WAYLAND (window->impl);
- GdkWindowState new_state = 0;
+ GdkWindowState new_state;
+ int width = impl->pending.width;
+ int height = impl->pending.height;
gboolean fixed_size;
- uint32_t *p;
- wl_array_for_each (p, states)
+ if (!impl->initial_configure_received)
{
- uint32_t state = *p;
- switch (state)
- {
- case XDG_SURFACE_STATE_FULLSCREEN:
- new_state |= GDK_WINDOW_STATE_FULLSCREEN;
- break;
- case XDG_SURFACE_STATE_MAXIMIZED:
- new_state |= GDK_WINDOW_STATE_MAXIMIZED;
- break;
- case XDG_SURFACE_STATE_ACTIVATED:
- new_state |= GDK_WINDOW_STATE_FOCUSED;
- break;
- case XDG_SURFACE_STATE_RESIZING:
- break;
- default:
- /* Unknown state */
- break;
- }
+ gdk_window_thaw_updates (window);
+ impl->initial_configure_received = TRUE;
+ }
+
+ /* xdg_popup configuration aren't handled yet so just pretend we listened. */
+ if (impl->display_server.xdg_popup)
+ {
+ zxdg_surface_v6_ack_configure (xdg_surface, serial);
+ return;
}
- new_state |= impl->pending.state;
+ new_state = impl->pending.state;
impl->pending.state = 0;
fixed_size =
(new_state & GDK_WINDOW_STATE_TILED) ? " tiled" : ""));
_gdk_set_window_state (window, new_state);
- xdg_surface_ack_configure (xdg_surface, serial);
+ zxdg_surface_v6_ack_configure (xdg_surface, serial);
if (impl->hint != GDK_WINDOW_TYPE_HINT_DIALOG &&
new_state & GDK_WINDOW_STATE_FOCUSED)
gdk_wayland_window_update_dialogs (window);
}
+static const struct zxdg_surface_v6_listener xdg_surface_listener = {
+ xdg_surface_configure,
+};
+
+static void
+xdg_toplevel_configure (void *data,
+ struct zxdg_toplevel_v6 *xdg_toplevel,
+ int32_t width,
+ int32_t height,
+ struct wl_array *states)
+{
+ GdkWindow *window = GDK_WINDOW (data);
+ GdkWindowImplWayland *impl = GDK_WINDOW_IMPL_WAYLAND (window->impl);
+ uint32_t *p;
+
+ wl_array_for_each (p, states)
+ {
+ uint32_t state = *p;
+ switch (state)
+ {
+ case ZXDG_TOPLEVEL_V6_STATE_FULLSCREEN:
+ impl->pending.state |= GDK_WINDOW_STATE_FULLSCREEN;
+ break;
+ case ZXDG_TOPLEVEL_V6_STATE_MAXIMIZED:
+ impl->pending.state |= GDK_WINDOW_STATE_MAXIMIZED;
+ break;
+ case ZXDG_TOPLEVEL_V6_STATE_ACTIVATED:
+ impl->pending.state |= GDK_WINDOW_STATE_FOCUSED;
+ break;
+ case ZXDG_TOPLEVEL_V6_STATE_RESIZING:
+ break;
+ default:
+ /* Unknown state */
+ break;
+ }
+ }
+
+ impl->pending.width = width;
+ impl->pending.height = height;
+}
+
static void
-xdg_surface_close (void *data,
- struct xdg_surface *xdg_surface)
+xdg_toplevel_close (void *data,
+ struct zxdg_toplevel_v6 *xdg_toplevel)
{
GdkWindow *window = GDK_WINDOW (data);
GdkDisplay *display;
_gdk_wayland_display_deliver_event (display, event);
}
-static const struct xdg_surface_listener xdg_surface_listener = {
- xdg_surface_configure,
- xdg_surface_close,
+static const struct zxdg_toplevel_v6_listener xdg_toplevel_listener = {
+ xdg_toplevel_configure,
+ xdg_toplevel_close,
};
static void
-gdk_wayland_window_create_xdg_surface (GdkWindow *window)
+gdk_wayland_window_create_xdg_toplevel (GdkWindow *window)
{
GdkWaylandDisplay *display_wayland = GDK_WAYLAND_DISPLAY (gdk_window_get_display (window));
GdkWindowImplWayland *impl = GDK_WINDOW_IMPL_WAYLAND (window->impl);
impl->initial_fullscreen_monitor < gdk_screen_get_n_monitors (screen))
fullscreen_output = _gdk_wayland_screen_get_wl_output (screen, impl->initial_fullscreen_monitor);
- impl->display_server.xdg_surface = xdg_shell_get_xdg_surface (display_wayland->xdg_shell, impl->display_server.wl_surface);
- xdg_surface_add_listener (impl->display_server.xdg_surface, &xdg_surface_listener, window);
+ impl->display_server.xdg_surface =
+ zxdg_shell_v6_get_xdg_surface (display_wayland->xdg_shell,
+ impl->display_server.wl_surface);
+ zxdg_surface_v6_add_listener (impl->display_server.xdg_surface,
+ &xdg_surface_listener,
+ window);
+ gdk_window_freeze_updates (window);
+
+ impl->display_server.xdg_toplevel =
+ zxdg_surface_v6_get_toplevel (impl->display_server.xdg_surface);
+ zxdg_toplevel_v6_add_listener (impl->display_server.xdg_toplevel,
+ &xdg_toplevel_listener,
+ window);
gdk_wayland_window_sync_parent (window, NULL);
gdk_wayland_window_sync_title (window);
if (window->state & GDK_WINDOW_STATE_MAXIMIZED)
- xdg_surface_set_maximized (impl->display_server.xdg_surface);
+ zxdg_toplevel_v6_set_maximized (impl->display_server.xdg_toplevel);
if (window->state & GDK_WINDOW_STATE_FULLSCREEN)
- xdg_surface_set_fullscreen (impl->display_server.xdg_surface, fullscreen_output);
+ zxdg_toplevel_v6_set_fullscreen (impl->display_server.xdg_toplevel,
+ fullscreen_output);
app_id = g_get_prgname ();
if (app_id == NULL)
app_id = gdk_get_program_class ();
- xdg_surface_set_app_id (impl->display_server.xdg_surface, app_id);
+ zxdg_toplevel_v6_set_app_id (impl->display_server.xdg_toplevel, app_id);
maybe_set_gtk_surface_dbus_properties (window);
maybe_set_gtk_surface_modal (window);
if (impl->hint == GDK_WINDOW_TYPE_HINT_DIALOG)
_gdk_wayland_screen_add_orphan_dialog (window);
+
+ wl_surface_commit (impl->display_server.wl_surface);
}
static void
-xdg_popup_done (void *data,
- struct xdg_popup *xdg_popup)
+xdg_popup_configure (void *data,
+ struct zxdg_popup_v6 *xdg_popup,
+ int32_t x,
+ int32_t y,
+ int32_t width,
+ int32_t height)
+{
+}
+
+static void
+xdg_popup_done (void *data,
+ struct zxdg_popup_v6 *xdg_popup)
{
GdkWindow *window = GDK_WINDOW (data);
gdk_window_hide (window);
}
-static const struct xdg_popup_listener xdg_popup_listener = {
+static const struct zxdg_popup_v6_listener xdg_popup_listener = {
+ xdg_popup_configure,
xdg_popup_done,
};
GdkWaylandDisplay *display = GDK_WAYLAND_DISPLAY (gdk_window_get_display (window));
GdkWindowImplWayland *impl = GDK_WINDOW_IMPL_WAYLAND (window->impl);
GdkWindowImplWayland *parent_impl = GDK_WINDOW_IMPL_WAYLAND (parent->impl);
+ struct zxdg_positioner_v6 *positioner;
+ GdkRectangle geometry;
+ GdkRectangle parent_geometry;
+ int parent_x, parent_y;
GdkSeat *gdk_seat;
guint32 serial;
- int x, y;
if (!impl->display_server.wl_surface)
return;
- if (!parent_impl->display_server.wl_surface)
+ if (!parent_impl->display_server.xdg_surface)
return;
- gdk_seat = gdk_display_get_default_seat (GDK_DISPLAY (display));
+ impl->display_server.xdg_surface =
+ zxdg_shell_v6_get_xdg_surface (display->xdg_shell,
+ impl->display_server.wl_surface);
+ zxdg_surface_v6_add_listener (impl->display_server.xdg_surface,
+ &xdg_surface_listener,
+ window);
+ gdk_window_freeze_updates (window);
- x = window->x - parent->x;
- y = window->y - parent->y;
+ positioner = zxdg_shell_v6_create_positioner (display->xdg_shell);
- serial = _gdk_wayland_seat_get_last_implicit_grab_serial (gdk_seat, NULL);
+ gdk_wayland_window_get_window_geometry (window, &geometry);
+ zxdg_positioner_v6_set_size (positioner, geometry.width, geometry.height);
+
+ parent_x = parent->x;
+ parent_y = parent->y;
+
+ gdk_wayland_window_get_window_geometry (parent, &parent_geometry);
+ parent_x += parent_geometry.x;
+ parent_y += parent_geometry.y;
+
+ zxdg_positioner_v6_set_anchor_rect (positioner,
+ (window->x + geometry.x) - parent_x,
+ (window->y + geometry.y) - parent_y,
+ 1, 1);
+ zxdg_positioner_v6_set_anchor (positioner,
+ (ZXDG_POSITIONER_V6_ANCHOR_TOP |
+ ZXDG_POSITIONER_V6_ANCHOR_LEFT));
+ zxdg_positioner_v6_set_gravity (positioner,
+ (ZXDG_POSITIONER_V6_GRAVITY_BOTTOM |
+ ZXDG_POSITIONER_V6_GRAVITY_RIGHT));
+
+ impl->display_server.xdg_popup =
+ zxdg_surface_v6_get_popup (impl->display_server.xdg_surface,
+ parent_impl->display_server.xdg_surface,
+ positioner);
+ zxdg_popup_v6_add_listener (impl->display_server.xdg_popup,
+ &xdg_popup_listener,
+ window);
+
+ zxdg_positioner_v6_destroy (positioner);
- impl->display_server.xdg_popup = xdg_shell_get_xdg_popup (display->xdg_shell,
- impl->display_server.wl_surface,
- parent_impl->display_server.wl_surface,
- seat, serial,
- x, y);
+ gdk_seat = gdk_display_get_default_seat (GDK_DISPLAY (display));
+ serial = _gdk_wayland_seat_get_last_implicit_grab_serial (gdk_seat, NULL);
+ zxdg_popup_v6_grab (impl->display_server.xdg_popup, seat, serial);
- xdg_popup_add_listener (impl->display_server.xdg_popup, &xdg_popup_listener, window);
+ wl_surface_commit (impl->display_server.wl_surface);
}
static struct wl_seat *
return FALSE;
}
-/* Get the window that can be used as a parent for a popup, i.e. a xdg_surface
+/* Get the window that can be used as a parent for a popup, i.e. a xdg_toplevel
* or xdg_popup. If the window is not, traverse up the transiency parents until
* we find one.
*/
{
GdkWindowImplWayland *impl = GDK_WINDOW_IMPL_WAYLAND (window->impl);
- if (impl->display_server.xdg_popup || impl->display_server.xdg_surface)
+ if (impl->display_server.xdg_popup || impl->display_server.xdg_toplevel)
return window;
window = impl->transient_for;
}
else
{
- gdk_wayland_window_create_xdg_surface (window);
+ gdk_wayland_window_create_xdg_toplevel (window);
}
}
else
{
- gdk_wayland_window_create_xdg_surface (window);
+ gdk_wayland_window_create_xdg_toplevel (window);
}
impl->mapped = TRUE;
impl->display_server.egl_window = NULL;
}
- if (impl->display_server.xdg_surface)
+ if (impl->display_server.xdg_toplevel)
{
- xdg_surface_destroy (impl->display_server.xdg_surface);
- impl->display_server.xdg_surface = NULL;
+ zxdg_toplevel_v6_destroy (impl->display_server.xdg_toplevel);
+ impl->display_server.xdg_toplevel = NULL;
}
else if (impl->display_server.xdg_popup)
{
- xdg_popup_destroy (impl->display_server.xdg_popup);
+ zxdg_popup_v6_destroy (impl->display_server.xdg_popup);
impl->display_server.xdg_popup = NULL;
}
+ if (impl->display_server.xdg_surface)
+ {
+ zxdg_surface_v6_destroy (impl->display_server.xdg_surface);
+ impl->display_server.xdg_surface = NULL;
+ impl->initial_configure_received = FALSE;
+ }
if (impl->display_server.wl_subsurface)
unmap_subsurface (window);
!WINDOW_IS_TOPLEVEL_OR_FOREIGN (window))
return;
- if (!impl->display_server.xdg_surface)
+ if (!impl->display_server.xdg_toplevel)
return;
- xdg_surface_set_minimized (impl->display_server.xdg_surface);
+ zxdg_toplevel_v6_set_minimized (impl->display_server.xdg_toplevel);
}
static void
return;
_gdk_wayland_window_save_size (window);
- if (impl->display_server.xdg_surface)
- xdg_surface_set_maximized (impl->display_server.xdg_surface);
+ if (impl->display_server.xdg_toplevel)
+ zxdg_toplevel_v6_set_maximized (impl->display_server.xdg_toplevel);
else
gdk_synthesize_window_state (window, 0, GDK_WINDOW_STATE_MAXIMIZED);
}
if (GDK_WINDOW_DESTROYED (window))
return;
- if (impl->display_server.xdg_surface)
- xdg_surface_unset_maximized (impl->display_server.xdg_surface);
+ if (impl->display_server.xdg_toplevel)
+ zxdg_toplevel_v6_unset_maximized (impl->display_server.xdg_toplevel);
else
gdk_synthesize_window_state (window, GDK_WINDOW_STATE_MAXIMIZED, 0);
}
return;
_gdk_wayland_window_save_size (window);
- if (impl->display_server.xdg_surface)
- xdg_surface_set_fullscreen (impl->display_server.xdg_surface, fullscreen_output);
- else {
- gdk_synthesize_window_state (window, 0, GDK_WINDOW_STATE_FULLSCREEN);
- impl->initial_fullscreen_monitor = monitor;
- }
+ if (impl->display_server.xdg_toplevel)
+ {
+ zxdg_toplevel_v6_set_fullscreen (impl->display_server.xdg_toplevel,
+ fullscreen_output);
+ }
+ else
+ {
+ gdk_synthesize_window_state (window, 0, GDK_WINDOW_STATE_FULLSCREEN);
+ impl->initial_fullscreen_monitor = monitor;
+ }
}
static void
impl->initial_fullscreen_monitor = -1;
_gdk_wayland_window_save_size (window);
- if (impl->display_server.xdg_surface)
- xdg_surface_set_fullscreen (impl->display_server.xdg_surface, NULL);
+ if (impl->display_server.xdg_toplevel)
+ zxdg_toplevel_v6_set_fullscreen (impl->display_server.xdg_toplevel, NULL);
else
gdk_synthesize_window_state (window, 0, GDK_WINDOW_STATE_FULLSCREEN);
}
impl->initial_fullscreen_monitor = -1;
- if (impl->display_server.xdg_surface)
- xdg_surface_unset_fullscreen (impl->display_server.xdg_surface);
+ if (impl->display_server.xdg_toplevel)
+ zxdg_toplevel_v6_unset_fullscreen (impl->display_server.xdg_toplevel);
else
gdk_synthesize_window_state (window, GDK_WINDOW_STATE_FULLSCREEN, 0);
}
switch (edge)
{
case GDK_WINDOW_EDGE_NORTH_WEST:
- resize_edges = XDG_SURFACE_RESIZE_EDGE_TOP_LEFT;
+ resize_edges = ZXDG_TOPLEVEL_V6_RESIZE_EDGE_TOP_LEFT;
break;
case GDK_WINDOW_EDGE_NORTH:
- resize_edges = XDG_SURFACE_RESIZE_EDGE_TOP;
+ resize_edges = ZXDG_TOPLEVEL_V6_RESIZE_EDGE_TOP;
break;
case GDK_WINDOW_EDGE_NORTH_EAST:
- resize_edges = XDG_SURFACE_RESIZE_EDGE_TOP_RIGHT;
+ resize_edges = ZXDG_TOPLEVEL_V6_RESIZE_EDGE_TOP_RIGHT;
break;
case GDK_WINDOW_EDGE_WEST:
- resize_edges = XDG_SURFACE_RESIZE_EDGE_LEFT;
+ resize_edges = ZXDG_TOPLEVEL_V6_RESIZE_EDGE_LEFT;
break;
case GDK_WINDOW_EDGE_EAST:
- resize_edges = XDG_SURFACE_RESIZE_EDGE_RIGHT;
+ resize_edges = ZXDG_TOPLEVEL_V6_RESIZE_EDGE_RIGHT;
break;
case GDK_WINDOW_EDGE_SOUTH_WEST:
- resize_edges = XDG_SURFACE_RESIZE_EDGE_BOTTOM_LEFT;
+ resize_edges = ZXDG_TOPLEVEL_V6_RESIZE_EDGE_BOTTOM_LEFT;
break;
case GDK_WINDOW_EDGE_SOUTH:
- resize_edges = XDG_SURFACE_RESIZE_EDGE_BOTTOM;
+ resize_edges = ZXDG_TOPLEVEL_V6_RESIZE_EDGE_BOTTOM;
break;
case GDK_WINDOW_EDGE_SOUTH_EAST:
- resize_edges = XDG_SURFACE_RESIZE_EDGE_BOTTOM_RIGHT;
+ resize_edges = ZXDG_TOPLEVEL_V6_RESIZE_EDGE_BOTTOM_RIGHT;
break;
default:
serial = _gdk_wayland_seat_get_last_implicit_grab_serial (gdk_device_get_seat (device),
&sequence);
- xdg_surface_resize (impl->display_server.xdg_surface,
- gdk_wayland_device_get_wl_seat (device),
- serial, resize_edges);
+ zxdg_toplevel_v6_resize (impl->display_server.xdg_toplevel,
+ gdk_wayland_device_get_wl_seat (device),
+ serial, resize_edges);
if (sequence)
gdk_wayland_device_unset_touch_grab (device, sequence);
serial = _gdk_wayland_seat_get_last_implicit_grab_serial (gdk_device_get_seat (device),
&sequence);
- xdg_surface_move (impl->display_server.xdg_surface,
- gdk_wayland_device_get_wl_seat (device),
- serial);
+ zxdg_toplevel_v6_move (impl->display_server.xdg_toplevel,
+ gdk_wayland_device_get_wl_seat (device),
+ serial);
if (sequence)
gdk_wayland_device_unset_touch_grab (device, sequence);
struct wl_seat *seat;
GdkWaylandDevice *device;
double x, y;
+ uint32_t serial;
switch (event->type)
{
seat = gdk_wayland_device_get_wl_seat (GDK_DEVICE (device));
gdk_event_get_coords (event, &x, &y);
- xdg_surface_show_window_menu (impl->display_server.xdg_surface,
- seat,
- _gdk_wayland_device_get_implicit_grab_serial (device, event),
- x, y);
+ serial = _gdk_wayland_device_get_implicit_grab_serial (device, event);
+ zxdg_toplevel_v6_show_window_menu (impl->display_server.xdg_toplevel,
+ seat, serial, x, y);
return TRUE;
}